Docker Sentry 迁移

Sentry 搭建

参考: https://github.com/hexh250786313/blog/issues/11

Sentry 飞书通知

在 sentry requirements 文件中添加依赖即可,然后重启 sentry

Sentry 迁移

备份 Volume

1
2
3
4
5
6
7
8
9
10
11
12
13
14
for i in "$@"; do
echo "开始备份:"$i
# 创建
docker run -it -d --name container_back -v $i:/volume alpine >/dev/null 2>&1
# 打包压缩
docker exec -it container_back tar -cjf /image_volume_back.tar.bz2 -C /volume ./ >/dev/null 2>&1
# 打包成一个新的images
docker commit -p container_back container_back >/dev/null 2>&1
# 将images导出为文件
docker save -o $i.tar container_back >/dev/null 2>&1
docker stop container_back >/dev/null 2>&1
docker rm container_back >/dev/null 2>&1
echo "完成备份:"$i
done

以上内容另存为 back.sh。

查看 docker volume 列表,并备份需要迁移的 volume

1
sh back.sh sentry-clickhouse sentry-data sentry-kafka...

备份镜像

批量导出镜像, 可以执行以下 Python 脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# encoding: utf-8

import re
import os
import subprocess

if __name__ == "__main__":
p = subprocess.Popen('docker images', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in p.stdout.readlines():

# 此处的正则表达式是为了匹配镜像名以kolla为开头的镜像
# 实际使用中根据需要自行调整
m = re.match(r'(^kolla[^\s]*\s*)\s([^\s]*\s)', line)

if not m:
continue

# 镜像名
iname = m.group(1).strip()
# tag
itag = m.group(2).strip()
# tar包的名字
if iname.find('/'):
tarname = iname.split('/')[0] + '_' + iname.split('/')[-1] + '_' + itag + '.tar'
else:
tarname = iname + '_' + itag + '.tar'
print tarname
ifull = iname + ':' + itag
#save
cmd = 'docker save -o ' + tarname + ' ' + ifull
print os.system(cmd)

retval = p.wait()

或者执行以下 shell 脚本

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
docker images > images.txt
awk '{print $1}' images.txt > images_cut.txt
sed -i '1d' images_cut.txt
while read LINE
do
docker save $LINE > ${LINE//\//_}.train.tar
echo ok
done < images_cut.txt
echo finish

恢复 Volume

1
2
3
4
5
6
7
8
9
10
11
12
13
for i in "$@"; do
echo "开始还原:"$i
# 建立 Docker Volume
docker volume create $i

# 还原文件为 Image
docker load -i $i.tar

# 挂载 Docker Volume之后,透过命令将原先 Image 内的压缩档解压缩到 Docker Volume,完成之后自动删掉 Alpine 的 Container
docker run --rm -v $i:/volume container_back sh -c "rm -rf /volume/* /volume/..?* /volume/.[!.]* ; tar -C /volume/ -xjf /image_volume_back.tar.bz2 ;"
docker rmi container_back
echo "完成还原:"$i
done

内容另存为 reduct.sh,并执行

1
sh reduct.sh sentry-clickhouse.tar sentry-data.tar sentry-kafka.tar...

恢复镜像

可以执行以下 python 脚本重新导入镜像

1
2
3
4
5
6
7
import  os

images = os.listdir(os.getcwd())
for imagename in images:
if imagename.endswith('.tar'):
print(imagename)
os.system('docker load -i %s'%imagename)

重启服务

启动 sentry docker-compose,并在 sentry 界面中将 根URL 修改为新的即可。

最后验证服务是否正常,查看各个容器日志是否有异常。